use super::*;
pub struct VoicemeeterVban<'a> {
remote: &'a VoicemeeterRemote,
}
impl<'a> VoicemeeterVban<'a> {
#[doc(hidden)]
pub fn new(remote: &'a VoicemeeterRemote) -> Self {
Self { remote }
}
pub fn param(&self, dot: impl Display) -> Cow<'static, ParameterNameRef> {
Cow::Owned(format!("{VBAN}.{}", dot).into())
}
pub fn enable(&self) -> BoolParameter {
BoolParameter::new(self.param("Enable"), self.remote)
}
pub fn incoming_stream(
&self,
index: impl Into<ZIndex>,
) -> Result<VoicemeeterVbanStream<'a, true>, ParameterError> {
let index = index.into();
const VALID: &[(VoicemeeterApplication, std::ops::RangeInclusive<u8>)] = &[
(VoicemeeterApplication::Voicemeeter, 0..=3),
(VoicemeeterApplication::VoicemeeterBanana, 0..=7),
(VoicemeeterApplication::VoicemeeterPotato, 0..=7),
(VoicemeeterApplication::PotatoX64Bits, 0..=7),
];
let param = format!("{VBAN}.instream");
match VALID.iter().find(|(app, _)| self.remote.program == *app) {
None => Err(ParameterError::Version(InvalidVoicemeeterVersion {
expected: &[
VoicemeeterApplication::Voicemeeter,
VoicemeeterApplication::VoicemeeterBanana,
VoicemeeterApplication::VoicemeeterPotato,
VoicemeeterApplication::PotatoX64Bits,
],
found: self.remote.program,
parameter: param,
})),
Some((_, i)) if i.contains(&(index.0 as u8)) => {
Ok(VoicemeeterVbanStream::<'a, true>::new(self.remote, index))
}
_ => Err(ParameterError::OutOfRange(OutOfRangeError {
name: param.to_string(),
index,
program: self.remote.program,
})),
}
}
pub fn outgoing_stream(
&self,
index: impl Into<ZIndex>,
) -> Result<VoicemeeterVbanStream<'a, false>, ParameterError> {
let index = index.into();
const VALID: &[(VoicemeeterApplication, std::ops::RangeInclusive<u8>)] = &[
(VoicemeeterApplication::Voicemeeter, 0..=3),
(VoicemeeterApplication::VoicemeeterBanana, 0..=7),
(VoicemeeterApplication::VoicemeeterPotato, 0..=7),
(VoicemeeterApplication::PotatoX64Bits, 0..=7),
];
let param = format!("{VBAN}.outstream");
match VALID.iter().find(|(app, _)| self.remote.program == *app) {
None => Err(ParameterError::Version(InvalidVoicemeeterVersion {
expected: &[
VoicemeeterApplication::Voicemeeter,
VoicemeeterApplication::VoicemeeterBanana,
VoicemeeterApplication::VoicemeeterPotato,
VoicemeeterApplication::PotatoX64Bits,
],
found: self.remote.program,
parameter: param,
})),
Some((_, i)) if i.contains(&(index.0 as u8)) => {
Ok(VoicemeeterVbanStream::<'a, false>::new(self.remote, index))
}
_ => Err(ParameterError::OutOfRange(OutOfRangeError {
name: param.to_string(),
index,
program: self.remote.program,
})),
}
}
}
pub struct VoicemeeterVbanStream<'a, const INPUT: bool> {
remote: &'a VoicemeeterRemote,
index: ZIndex,
}
impl<'a, const INPUT: bool> VoicemeeterVbanStream<'a, INPUT> {
#[doc(hidden)]
pub fn new(remote: &'a VoicemeeterRemote, index: ZIndex) -> Self {
Self { remote, index }
}
pub fn param(&self, dot: impl Display) -> Cow<'static, ParameterNameRef> {
Cow::Owned(
format!(
"{VBAN}.{}stream[{}].{}",
match INPUT {
true => "in",
false => "out",
},
self.index,
dot
)
.into(),
)
}
pub fn on(&self) -> BoolParameter {
BoolParameter::new(self.param("on"), self.remote)
}
pub fn name(&self) -> StringParameter {
StringParameter::new(self.param("name"), self.remote)
}
pub fn ip(&self) -> StringParameter {
StringParameter::new(self.param("ip"), self.remote)
}
pub fn port(&self) -> IntParameter {
IntParameter::new(self.param("port"), self.remote, 0..=u16::MAX as i32)
}
pub fn quality(&self) -> IntParameter {
IntParameter::new(self.param("quality"), self.remote, 0..=4)
}
pub fn route(&self) -> IntParameter {
IntParameter::new(self.param("route"), self.remote, 0..=8)
}
}
impl<'a> VoicemeeterVbanStream<'a, true> {
pub fn sample_rate(&self) -> IntParameter<'a, false, true> {
IntParameter::new(self.param("sr"), self.remote, 11025..=96000)
}
pub fn channel(&self) -> IntParameter<'a, false, true> {
IntParameter::new(self.param("channel"), self.remote, 1..=8)
}
pub fn bit(&self) -> IntParameter<'a, false, true> {
IntParameter::new(self.param("bit"), self.remote, 1..=2)
}
}
impl<'a> VoicemeeterVbanStream<'a, false> {
pub fn sample_rate(&self) -> IntParameter {
IntParameter::new(self.param("sr"), self.remote, 11025..=96000)
}
pub fn channel(&self) -> IntParameter {
IntParameter::new(self.param("channel"), self.remote, 1..=8)
}
pub fn bit(&self) -> IntParameter {
IntParameter::new(self.param("bit"), self.remote, 1..=2)
}
}